from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from warehouse.models import Role, Permission, UserRole, RolePermission


class Command(BaseCommand):
    help = '初始化仓库管理系统数据'

    def handle(self, *args, **options):
        # 创建角色
        admin_role, created = Role.objects.get_or_create(
            name='管理员',
            defaults={'description': '系统管理员，拥有所有权限'}
        )
        if created:
            self.stdout.write(f'创建角色: {admin_role.name}')
        else:
            self.stdout.write(f'角色已存在: {admin_role.name}')

        warehouse_role, created = Role.objects.get_or_create(
            name='仓库员',
            defaults={'description': '仓库操作员，可以进行商品和库存管理'}
        )
        if created:
            self.stdout.write(f'创建角色: {warehouse_role.name}')
        else:
            self.stdout.write(f'角色已存在: {warehouse_role.name}')

        finance_role, created = Role.objects.get_or_create(
            name='财务',
            defaults={'description': '财务人员，可以查看和管理财务信息'}
        )
        if created:
            self.stdout.write(f'创建角色: {finance_role.name}')
        else:
            self.stdout.write(f'角色已存在: {finance_role.name}')

        # 创建权限
        permissions_data = [
            # 商品管理权限
            {'code': 'goods_read', 'name': '查看商品', 'description': '查看商品列表和详情'},
            {'code': 'goods_create', 'name': '创建商品', 'description': '创建新的商品'},
            {'code': 'goods_update', 'name': '编辑商品', 'description': '编辑商品信息'},
            {'code': 'goods_delete', 'name': '删除商品', 'description': '删除商品'},

            # 入库管理权限
            {'code': 'inbound_read', 'name': '查看入库记录', 'description': '查看入库记录列表'},
            {'code': 'inbound_create', 'name': '创建入库记录', 'description': '创建入库记录'},

            # 出库管理权限
            {'code': 'outbound_read', 'name': '查看出库记录', 'description': '查看出库记录列表'},
            {'code': 'outbound_create', 'name': '创建出库记录', 'description': '创建出库记录'},

            # 库存盘点权限
            {'code': 'inventory_read', 'name': '查看盘点记录', 'description': '查看库存盘点记录'},
            {'code': 'inventory_create', 'name': '创建盘点记录', 'description': '创建库存盘点记录'},

            # 财务管理权限
            {'code': 'finance_read', 'name': '查看财务信息', 'description': '查看工资和财务记录'},
            {'code': 'finance_manage', 'name': '管理财务', 'description': '计算工资和管理财务'},
        ]

        for perm_data in permissions_data:
            permission, created = Permission.objects.get_or_create(
                code=perm_data['code'],
                defaults={
                    'name': perm_data['name'],
                    'description': perm_data['description']
                }
            )
            if created:
                self.stdout.write(f'创建权限: {permission.name}')
            else:
                self.stdout.write(f'权限已存在: {permission.name}')

        # 为角色分配权限
        # 管理员拥有所有权限
        admin_permissions = Permission.objects.all()
        for perm in admin_permissions:
            RolePermission.objects.get_or_create(role=admin_role, permission=perm)
        self.stdout.write(f'为 {admin_role.name} 分配所有权限')

        # 仓库员权限
        warehouse_permissions = Permission.objects.filter(
            code__in=[
                'goods_read', 'goods_create', 'goods_update',
                'inbound_read', 'inbound_create',
                'outbound_read', 'outbound_create',
                'inventory_read', 'inventory_create'
            ]
        )
        for perm in warehouse_permissions:
            RolePermission.objects.get_or_create(role=warehouse_role, permission=perm)
        self.stdout.write(f'为 {warehouse_role.name} 分配权限')

        # 财务权限
        finance_permissions = Permission.objects.filter(
            code__in=['finance_read', 'finance_manage', 'goods_read']
        )
        for perm in finance_permissions:
            RolePermission.objects.get_or_create(role=finance_role, permission=perm)
        self.stdout.write(f'为 {finance_role.name} 分配权限')

        # 创建默认用户并分配角色
        admin_user, created = User.objects.get_or_create(
            username='admin',
            defaults={
                'is_staff': True,
                'is_superuser': True,
                'email': 'admin@example.com'
            }
        )
        if created:
            admin_user.set_password('admin123')
            admin_user.save()
            self.stdout.write(f'创建管理员用户: {admin_user.username} (密码: admin123)')
        else:
            self.stdout.write(f'管理员用户已存在: {admin_user.username}')

        # 为管理员用户分配管理员角色
        UserRole.objects.get_or_create(user=admin_user, role=admin_role)
        self.stdout.write(f'为用户 {admin_user.username} 分配 {admin_role.name} 角色')

        self.stdout.write(
            self.style.SUCCESS('仓库管理系统数据初始化完成')
        )